package com.cn.serverline.lineicp.workshopPlan.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cn.serverline.lineicp.workshopPlan.entity.SparePartsType;
import com.cn.serverline.lineicp.workshopPlan.entity.request.SparePartsRequest;
import com.cn.serverline.lineicp.workshopPlan.enums.RolingPlanException;
import com.cn.serverline.lineicp.workshopPlan.mapper.SparePartsTypeMapper;
import com.cn.serverline.lineicp.workshopPlan.service.SparePartsService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * 零组件 服务实现类
 * @author 田江余
 * @date 2024年7月29日
 */

@Service
public class SparePartsServiceImpl extends ServiceImpl<SparePartsTypeMapper, SparePartsType> implements SparePartsService {

    @Resource
    private SparePartsTypeMapper sparePartsMapper;
    /**
     * 添加零组件
     * @param sparePartsRequest 请求参数
     * @return
     */
    @Override
    public String add(SparePartsRequest sparePartsRequest) {
        // 检查编号是否已存在
        LambdaQueryWrapper<SparePartsType> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SparePartsType::getCode, sparePartsRequest.getCode());
        SparePartsType existingSparePart = sparePartsMapper.selectOne(queryWrapper);
        if (existingSparePart != null) {
            // 如果编号已存在，抛出异常或返回错误信息
            throw new ServiceException(RolingPlanException.ONE);
        }

        // 创建新的SparePartsType实例并复制属性
        SparePartsType spareParts = new SparePartsType();
        BeanUtil.copyProperties(sparePartsRequest, spareParts);
        spareParts.setCreateTime(new Date());

        // 保存到数据库
        this.save(spareParts);

        // 返回新创建的SparePartsType实例的id，作为一个字符串
        return spareParts.getId().toString();
    }

    /**
     *删除零组件
     * @param sparePartsRequest 请求参数
     */
    @Override
    public void del(SparePartsRequest sparePartsRequest) {
        this.removeById(sparePartsRequest.getId());
    }

    /**
     * 修改零组件
     * @param sparePartsRequest 请求参数
     */
    @Override
    public void edit(SparePartsRequest sparePartsRequest) {
        //判断编号不重复
        LambdaQueryWrapper<SparePartsType> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SparePartsType::getCode, sparePartsRequest.getCode());
        SparePartsType existingSparePart = sparePartsMapper.selectOne(queryWrapper);
        if (existingSparePart != null) {
            // 如果编号已存在，抛出异常或返回错误信息
            throw new ServiceException(RolingPlanException.ONE);
        }

        // 首先，我们需要根据请求中的ID找到要修改的零组件记录
        SparePartsType spareParts = this.getById(sparePartsRequest.getId());

        // 如果记录不存在，则抛出异常或返回错误信息
        if (spareParts == null) {
            throw new ServiceException(RolingPlanException.ZERO);
        }

        // 使用BeanUtil.copyProperties方法将请求参数中的属性复制到找到的零组件记录中
        BeanUtil.copyProperties(sparePartsRequest, spareParts);

        // 更新修改时间
        spareParts.setUpdateTime(new Date());

        // 调用save方法来持久化更改
        this.updateById(spareParts);
    }

    /**
     * 查询零组件
     * @param sparePartsRequest 请求参数
     * @return 匹配的零组件列表
     */
    @Override
    public Page<SparePartsType> findList(SparePartsRequest sparePartsRequest) {
        // 创建查询条件构建器
        LambdaQueryWrapper<SparePartsType> queryWrapper = new LambdaQueryWrapper<>();

        // 根据请求参数构建查询条件
        queryWrapper.like(sparePartsRequest.getName() != null, SparePartsType::getName, sparePartsRequest.getName());
        queryWrapper.eq(sparePartsRequest.getId() !=null, SparePartsType::getId, sparePartsRequest.getId());

        // 返回查询结果
        return this.page(PageFactory.defaultPage(), queryWrapper);
    }
}
